package by.bsu.scs.db.dao;

// Generated 05.03.2011 11:02:55 by Hibernate Tools 3.4.0.CR1

import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.LockMode;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Example;

import by.bsu.scs.model.User;
import by.bsu.scs.util.db.HibernateUtil;

/**
 * Home object for domain model class User.
 * @see by.bsu.scs.model.User
 * @author Hibernate Tools
 */
public class UserHome {

	private static final String GET_STUDENTS_BY_INSTRUCTOR = "getStudentsByInstructor";
	private static final String INSTRUCTOR_ID = "instructorId";
	private static final Logger LOGGER = Logger.getLogger(UserHome.class);
	
	private Session session = null;
	private Transaction transaction = null;

	public void persist(User transientInstance) {
		LOGGER.info("persisting User instance");
		session = HibernateUtil.openCurrentSession();
		try {
			transaction = session.beginTransaction();
			session.save(transientInstance);
			transaction.commit();
			LOGGER.info("persist successful");
		} catch (HibernateException e) {
            transaction.rollback();
            LOGGER.error("persist failed", e.getCause());
        }
	}

	public void attachDirty(User instance) {
		LOGGER.info("attaching dirty User instance");
		session = HibernateUtil.openCurrentSession();
		try {
			transaction = session.beginTransaction();
			session.saveOrUpdate(instance);
			transaction.commit();
			LOGGER.info("attach successful");
		} catch (HibernateException e) {
            transaction.rollback();
            LOGGER.error("attach failed", e.getCause());
        }
	}

	@SuppressWarnings("deprecation")
	public void attachClean(User instance) {
		LOGGER.info("attaching clean User instance");
		session = HibernateUtil.openCurrentSession();
		try {
			transaction = session.beginTransaction();
			session.lock(instance, LockMode.NONE);
			transaction.commit();
			LOGGER.info("attach successful");
		} catch (HibernateException e) {
            transaction.rollback();
            LOGGER.error("attach failed", e.getCause());
        }
	}

	public void delete(User persistentInstance) {
		LOGGER.info("deleting User instance");
		session = HibernateUtil.openCurrentSession();
		try {
			transaction = session.beginTransaction();
			session.delete(persistentInstance);
			transaction.commit();
			LOGGER.info("delete successful");
		} catch (HibernateException e) {
            transaction.rollback();
            LOGGER.error("delete failed", e.getCause());
        }
	}

	public User merge(User detachedInstance) {
		LOGGER.info("merging User instance");
		session = HibernateUtil.openCurrentSession();
		try {
			transaction = session.beginTransaction();
			User result = (User) session.merge(detachedInstance);
			transaction.commit();
			LOGGER.info("merge successful");
			return result;
		} catch (HibernateException e) {
            transaction.rollback();
            LOGGER.error("merge failed", e.getCause());
            return null;
        }
	}

	public User findById(int id) {
		LOGGER.info("getting User instance with id: " + id);
		session = HibernateUtil.openCurrentSession();
		try {
			transaction = session.beginTransaction();
			User instance = (User) session.get(
					"by.bsu.scs.model.User", id);
			if (instance == null) {
				LOGGER.info("get successful, no instance found");
			} else {
				LOGGER.info("get successful, instance found");
			}
			transaction.commit();
			return instance;
		} catch (RuntimeException e) {
			transaction.rollback();
			LOGGER.error("get failed", e.getCause());
			return null;
		}
	}

	@SuppressWarnings("rawtypes")
	public List findByExample(User instance) {
		LOGGER.info("finding User instance by example");
		session = HibernateUtil.openCurrentSession();
		try {
			transaction = session.beginTransaction();
			//Exclude zeroes was used to avoid problems with default bsuId = 0
			Example example = Example.create(instance).excludeZeroes();
			List results = session.createCriteria("by.bsu.scs.model.User").add(example).list();
			LOGGER.info("find by example successful, result size: "
					+ results.size());
			transaction.commit();
			return results;
		} catch (RuntimeException e) {
			transaction.rollback();
			LOGGER.error("find by example failed", e.getCause());
			return null;
		}
	}
	
// ***************** Manually created methods ******************
	
		
	@SuppressWarnings("unchecked")
	public List<User> getStudentsByInstructor(User instructor) {
		Session session = HibernateUtil.openCurrentSession();
		Transaction transaction = null;
		List<User> userList = null;
		try {
			transaction = session.beginTransaction();
			userList = session
					.getNamedQuery(GET_STUDENTS_BY_INSTRUCTOR)
					.setInteger(INSTRUCTOR_ID, instructor.getUserId()).list();
			transaction.commit();
			LOGGER.info("find successful");
		} catch (HibernateException e) {
			if (transaction != null) {
				transaction.rollback();
			}
			LOGGER.error("find failed", e.getCause());
		}
		return userList;
	}
}
